package pkg

import (
	"fmt"
	"gopkg.in/yaml.v3"
	"io/ioutil"
)

// Test1 具体的某一项
//
//	注意属性大写才能被外部访问
type Test1 struct {
	Name   string `yaml:"name"`
	Height int    `yaml:"height"`
	Age    int    `yaml:"age"`
}

type Test2 struct {
	Port int    `yaml:"port"`
	Host string `yaml:"host"`
}

// Test3 整体 对应到yaml文件里面的首项
type Test3 struct {
	ShawConfig   Test1 `yaml:"shaw"`
	ServerConfig Test2 `yaml:"server"`
}

// 读到的所有数据放在全局变量里面
var Test4 *Test3

func main() {
	configPath := "./Test4/Test4.yaml"
	ConfigFileBytes, err := ioutil.ReadFile(configPath)

	//exceptionHand 极为糟糕的异常处理出现一次异常需要处理一次异常
	if err != nil {
		//打印错误信息并结束程序
		panic(err)
	}
	Test4 = &Test3{}

	//decode bytes
	err = yaml.Unmarshal(ConfigFileBytes, Test4)
	if err != nil {
		panic(err.Error())
	}

	serverConfig := Test4.ServerConfig

	//头痛砍头，没有null的概念，一个实例化的属性都有一个默认值
	if serverConfig.Port == 0 {
		panic("尚未配置端口号")
	}

	fmt.Println(Test4.ServerConfig)
	fmt.Println(Test4.ShawConfig)
}
